// 7. 整数反转
// 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。

// 如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ，就返回 0。

// 假设环境不允许存储 64 位整数（有符号或无符号）。
//

// 示例 1：

// 输入：x = 123
// 输出：321
// 示例 2：

// 输入：x = -123
// 输出：-321
// 示例 3：

// 输入：x = 120
// 输出：21
// 示例 4：

// 输入：x = 0
// 输出：0

// 来源：力扣（LeetCode）
// 链接：https://leetcode-cn.com/problems/reverse-integer
// 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

/**
 * @param {number} x
 * @return {number}
 */

// 正常解法
var reverse1 = function (x) {
	let arr = x.toString().split(''),
		result = [],
		num = 0
	if (arr[0] === '-') {
		arr.splice(0, 1)
		result.push('-')
	}
	for (let i = arr.length - 1; i >= 0; i--) {
		result.push(arr[i])
	}
	num = Number(result.join(''))
	return num < -Math.pow(2, 31) || num > Math.pow(2, 31) - 1 ? 0 : num
}

// console.log(reverse1(-120))

/**
 * @param {number} x
 * @return {number}
 * @description 按位转换
 */
/**
 推入数字 result = 10 * result + (x % 10)
 弹出数字 x = ~~(x / 10)
 关于~与~~
~运算
1.把运算数转换成 32 位数字
2.把二进制数转换成它的二进制反码（0->1, 1->0）
3.把二进制数转换成浮点数
对任一数值 x 进行按位非操作的结果为 -(x + 1)
console.log('~null: ', ~null);       // => -1
console.log('~undefined: ', ~undefined);  // => -1
console.log('~0: ', ~0);          // => -1
console.log('~{}: ', ~{});         // => -1
console.log('~[]: ', ~[]);         // => -1
console.log('~(1/0): ', ~(1/0));      // => -1
console.log('~false: ', ~false);      // => -1
console.log('~true: ', ~true);       // => -2
console.log('~1.2543: ', ~1.2543);     // => -2
console.log('~4.9: ', ~4.9);       // => -5
console.log('~(-2.999): ', ~(-2.999));   // => 1
~~运算
~~x就为 -(-(x+1) + 1)
~~value可以代替parseInt(value)
 */
var reverse2 = function (x) {
	let result = 0
	while (x !== 0) {
		result = 10 * result + (x % 10)
		x = ~~(x / 10)
		console.log('result', result)
		console.log('x', x)
	}
	return result > Math.pow(2, 31) - 1 || result < -Math.pow(2, 31)
		? 0
		: result
}
// result 0
// x -12
// result -2
// x -1
// result -21
// x 0
// console.log(reverse2(123))

// 逻辑运算法用例
// 1.找到一个二进制数里面的所有1
function findOne(x) {
	let result = 0
	while (x > 0) {
		if ((x & 1) === 1) result++
		x = x >> 1
	}
	return result
}

console.log(findOne(17))
